package com.tencent.api.preparedstatement;

import org.junit.Test;

import java.sql.*;

/**
 * 练习preparedStatement的特殊使用情况
 */
public class PSOtherPart {

    /**
     * Todo:
     *      t_user插入一条数据，并且获取数据库自增长的主键
     *
     * Todo:使用总结
     *      1.创建preparedStatement的时候，告知，携带回数据库自增长的主键（sql，Statement.RETURN_GENERATED_KEYS)
     *      2.获取司机装主键值的结果集对象，一行一列，获取对应的数据即可(ResultSet generatedKeys = preparedStatement.getGeneratedKeys();)
     */
    @Test
    public void returnPrimaryKey() throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //创建连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "1234");
        //写SQL语句
        String sql = "INSERT INTO t_user(account, PASSWORD, nickname) values (?,?,?);";
        //创建preparedStatement
        //创建preparedStatement的时候，告知，携带回数据库自增长的主键
        PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        //动态绑定数据内容，占位符赋值
        preparedStatement.setObject(1,"test1");
        preparedStatement.setObject(2,"123456");
        preparedStatement.setObject(3,"驴蛋蛋");
        //发送 ，查询，得到结果
        int rows = preparedStatement.executeUpdate();
        //解析结果
        if(rows>0){
            System.out.println("插入成功！");

            //可以获取回显的主键
            //获取司机装主键值的结果集对象，一行一列，获取对应的数据即可
            ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
            generatedKeys.next();//移动一下光标
            int id = generatedKeys.getInt(1);
            System.out.println("id:"+id);
        }else {
            System.out.println("插入失败！");
        }
        //释放资源
        preparedStatement.close();
        connection.close();
    }


    /**
     * 使用普通的方式创建10000条数据
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    @Test
    public void testInsert() throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //创建连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "1234");
        //写SQL语句
        String sql = "INSERT INTO t_user(account, PASSWORD, nickname) values (?,?,?);";
        //创建preparedStatement
        //创建preparedStatement的时候，告知，携带回数据库自增长的主键
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        long start = System.currentTimeMillis();

        //动态绑定数据内容，占位符赋值
        for (int i = 0; i < 10000; i++) {
            preparedStatement.setObject(1,"yb"+i);
            preparedStatement.setObject(2,"wxj"+i);
            preparedStatement.setObject(3,"wjj"+i);

            //发送 ，查询，得到结果
            preparedStatement.executeUpdate();
        }

        long end = System.currentTimeMillis();

        //解析结果
        System.out.println("执行10000次数据消耗的时间"+(end-start));//执行10000次数据消耗的时间5285
        //释放资源
        preparedStatement.close();
        connection.close();
    }


    /**
     * 使用批量的方式创建10000条数据
     *
     * TODO：总结批量插入
     *      1.路径后面添加?rewriteBatchedStatements=true 允许批量插入
     *      2.insert into values，不能是value，最后不能写;
     *      3.不是执行语句每条，而是批量添加 addBatch()
     *      4.遍历 添加完毕后，统一 批量执行executeBatch()
     */
    @Test
    public void testBatchInsert() throws ClassNotFoundException, SQLException {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //创建连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu?rewriteBatchedStatements=true", "root", "1234");
        //写SQL语句
        String sql = "INSERT INTO t_user(account, PASSWORD, nickname) values (?,?,?)";//一定要写values，不能是value
        //创建preparedStatement
        //创建preparedStatement的时候，告知，携带回数据库自增长的主键
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        long start = System.currentTimeMillis();

        //动态绑定数据内容，占位符赋值
        for (int i = 0; i < 10000; i++) {
            preparedStatement.setObject(1,"yba"+i);
            preparedStatement.setObject(2,"wxja"+i);
            preparedStatement.setObject(3,"wjja"+i);

            //不执行，追加到values的后面
            preparedStatement.addBatch();
        }
        //执行批量操作
        preparedStatement.executeBatch();

        long end = System.currentTimeMillis();

        //解析结果
        System.out.println("执行10000次数据消耗的时间"+(end-start));//执行10000次数据消耗的时间5285
        //释放资源
        preparedStatement.close();
        connection.close();
    }

}
